<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 迭代器 Iterator   --------迭代数据结构中的内容
        // 数组
        // let arr = [21, 12, 35, 41];
        // let irt = arr[Symbol.iterator]();
        // console.log(irt.next(),
        //     irt.next(),
        //     irt.next(),
        //     irt.next(),
        //     irt.next());
        // console.log(arr);

        // set/map集合
        // let set = new Set([1, 2, 3, 4]);
        // console.log(set);
        // let setIrt = set[Symbol.iterator]();
        // console.log(setIrt.next());

        // let map = new Map([
        //     ['name', '黄蜀郎'],
        //     ['age', 40]
        // ]);
        // console.log(map);
        // let mapIrt = map[Symbol.iterator]();
        // console.log(mapIrt.next());

        // for...of    
        // for...in  只能遍历键值，可能还会遍历出原型上的属性


        // 字符串
        // let str = 'Helllo 黄蜀郎';
        // let strIrt = str[Symbol.iterator]();
        // console.log(strIrt.next());


        // 对象
        // let obj = {
        //     name: '黄蜀郎',
        //     age: 40,
        //     son: '王小宝'
        // }

        // // let objIrt = obj[Symbol.iterator](); //原型上没有Iterator,会报错
        // console.log(objIrt.next());



        // 生成器
        // 普通函数
        // function show(){
        //     console.log('普通函数');
        // }

        // Generator函数（生成器函数）  处理异步任务
        // function* gen() {
        //     console.log('生成器函数进入了...');
        //     yield console.log(1);
        //     yield console.log(2);
        //     yield console.log(3);
        //     yield console.log(4);
        //     return 5;
        // }
        // let irt = gen();
        // irt.next();
        // irt.next();
        // irt.next();



        // 生成器例子
        function preLoad() {
            console.log('准备加载数据');
        }

        function loading() {
            var x = 0;
            var id = setInterval(function() {
                console.log('正在加载...' + ++x);
                if (x == 20) {
                    clearInterval(id);
                    x = 0;
                    // 加载完成继续调用下一步
                    irt.next({
                        code: 200,
                        msg: '密码错误，请重试',
                        data: {
                            name: '黄蜀郎',
                            age: 40,
                            son: '王小宝'
                        }

                    });
                }
            }, 100)
        }

        function loaded(data) {
            console.log(data);
        }

        function failed(msg) {
            console.log(msg);
        }

        function* loadData() {
            preLoad(); //显示进度条
            let result = yield loading(); //显示进度加载状态
            if (result.code == 200) {
                loaded(result.data);
            } else {
                failed(result.msg);
            }
        }
        let irt = loadData();
        irt.next();


        // 生成器yield返回值
        // function* test() {
        //     let num = 10;
        //     let y = yield console.log(num + 10);
        //     console.log('gen:Y ' + y);
        //     let z = yield console.log(y + 10);
        //     console.log('gen:Z ' + z);
        //     return z;
        // }
        // let irt = test();
        // irt.next();
        // irt.next(10);
        // irt.next(20);


        // 在一个生成器函数中调用另一个生成器函数，要在yield后面加*
        // function* test1() {
        //     yield* test();
        // }
    </script>
</body>

</html>